home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / cdplay / src / cdtime.c < prev    next >
Text File  |  1991-10-18  |  29KB  |  1,007 lines

  1. /* << High C V1.4 >> **********************************************************
  2. **
  3. **    CD演奏ライブラリ用 CD-ROM時間計算プログラム
  4. **
  5. **    1991.02.09 : CREATE
  6. **    1991.02.09 : FINISH
  7. **
  8. **    < HISTORY >
  9. **    1991.02.09 : CREATE
  10. **    1991.02.27 : 全面改訂開始....
  11. **    1991.03.23 : 全面改訂終了(新ライブラリ誕生)
  12. **    1991.03.28 : programデータ追加時のディスク内経過/ディスク内残り時間のバグ修正.
  13. **    1991.03.30 : CDDA_next_music() にて最後の曲の時の処理で、プログラムモード用
  14. **                 残り曲数の設定に誤りがあったのを修正.
  15. **    1991.06.07 : 清書
  16. **
  17. **    < note > : TABS = 4
  18. **
  19. **    All Rights Reserved, Copyright (C) Y.Hirata 1991.
  20. **
  21. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  22. **
  23. ******************************************************************************/
  24.  
  25. #undef _CDDA_LIB
  26.  
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include "cdda.h"
  30.  
  31. extern char    CDDA_FLG_pauseplay ;    /*  演奏開始指定時間にPAUSE解除するか?    */
  32.  
  33. extern int    CDDA_PLAY_no[CDDA_MAX_TRACK] ;    /*  演奏用曲番号格納            */
  34. extern int    CDDA_nplay ;                    /*  次は↑の内何番目か?        */
  35. extern int    CDDA_prgptr ;                    /*  プログラム用ポインタ                */
  36.  
  37. extern int    CDDA_PLAY_mode ;                /*  現在の演奏モード                */
  38.  
  39. /**************************  時間の大小を求める  *****************************/
  40. int    CDDA_cmptime(
  41.         signed char min1,signed char sec1,signed char frame1,
  42.         signed char min2,signed char sec2,signed char frame2 )
  43. /*=============================================================================
  44. **    2つのCD用時間を比較する.
  45. **
  46. **    < INPUT  > : 比較する2つの時間(分・秒・フレーム)
  47. **    < OUTPUT > : なし
  48. **    < RETURN > : 大小関係( T1 < T2 は -1 , T1 = T2 は 0 , T1 > T2 は +1 )
  49. **
  50. **    時間の正当性チェックはしていないので、不当データを使用しないようにして下さい.
  51. =============================================================================*/
  52. {
  53.     if ( min1 > min2 ) {
  54.         return( 1 ) ;                                    /*  TIME1 > TIME2    */
  55.  
  56.     } else if ( min1 == min2 ) {
  57.         if ( sec1 > sec2 ) {
  58.             return( 1 ) ;                                /*  TIME1 > TIME2    */
  59.  
  60.         } else if ( sec1 == sec2 ) {
  61.             if ( frame1 > frame2 ) {
  62.                 return( 1 ) ;                            /*  TIME1 > TIME2    */
  63.  
  64.             } else if ( frame1 == frame2 ) {
  65.                 return( 0 ) ;                            /*  TIME1 = TIME2    */
  66.  
  67.             } else {
  68.                 return( -1 ) ;                            /*  TIME1 < TIME2    */
  69.             }
  70.  
  71.         } else {
  72.             return( -1 ) ;                                /*  TIME1 < TIME2    */
  73.         }
  74.  
  75.     } else {
  76.         return( -1 ) ;                                    /*  TIME1 < TIME2    */
  77.     }
  78. }
  79.  
  80. /****************************  時間差を求める  *******************************/
  81. void CDDA_subtime(
  82.         char min1,char sec1,char frame1,
  83.         char min2,char sec2,char frame2,
  84.         char *min,char *sec,char *frame )
  85. /*=============================================================================
  86. **    2つのCD用時間の差を求める.
  87. **
  88. **    < INPUT  > : 時間1, 時間2 (分・秒・フレーム)
  89. **    < OUTPUT > : 時間3 = 時間1 - 時間2 (分・秒・フレーム)
  90. **    < RETURN > : なし
  91. **
  92. **    必ず 時間1 >= 時間2 として下さい.
  93. **    時間の正当性チェックはしていないので、不当データを使用しないようにして下さい.
  94. =============================================================================*/
  95. {
  96.     *min = 0 ; *sec = 0 ; *frame = 0 ;
  97.     if ( frame1 >= frame2 ) {
  98.         *frame = frame1 - frame2 ;
  99.     } else {
  100.         frame1 += 75 ;
  101.         if ( sec1 == 0 ) {
  102.             sec1 += 60 ;
  103.             min1 -- ;
  104.         }
  105.         sec1 -- ;
  106.         *frame = frame1 - frame2 ;
  107.     }
  108.     if ( sec1 >= sec2 ) {
  109.         *sec = sec1 - sec2 ;
  110.     } else {
  111.         sec1 += 60 ;
  112.         min1 -- ;
  113.         *sec = sec1 - sec2 ;
  114.     }
  115.     *min = min1 - min2 ;
  116.  
  117. }
  118.  
  119. /****************************  時間和を求める  *******************************/
  120. void CDDA_addtime(
  121.         char min1,char sec1,char frame1,
  122.         char min2,char sec2,char frame2,
  123.         char *min,char *sec,char *frame )
  124. /*=============================================================================
  125. **    2つのCD用時間の和を求める.
  126. **
  127. **    < INPUT  > : 時間1, 時間2 (分・秒・フレーム)
  128. **    < OUTPUT > : 時間3 = 時間1 + 時間2 (分・秒・フレーム)
  129. **    < RETURN > : なし
  130. **
  131. **    時間の正当性チェックはしていないので、不当データを使用しないようにして下さい.
  132. =============================================================================*/
  133. {
  134.     min1 += min2 ;
  135.     sec1 += sec2 ;
  136.     frame1 += frame2 ;
  137.     if ( sec1 >= 60 ) {
  138.         sec1 -= 60 ;
  139.         min1 ++ ;
  140.     }
  141.     if ( frame1 >= 75 ) {
  142.         frame1 -= 75 ;
  143.         sec1 ++ ;
  144.         if ( sec1 >= 60 ) {
  145.             sec1 -= 60 ;
  146.             min1 ++ ;
  147.         }
  148.     }
  149.     *min = min1 ;
  150.     *sec = sec1 ;
  151.     *frame = frame1 ;
  152. }
  153.  
  154. /***************************  演奏開始時間の設定  ****************************/
  155. void CDDA_set_time_start( int trackno )
  156. /*=============================================================================
  157. **    演奏用の開始時間を設定する.
  158. **
  159. **    < INPUT  > : 演奏開始トラック(曲番号:1~99)
  160. **    < OUTPUT > : なし
  161. **    < RETURN > : なし
  162. **
  163. **    不当な曲番号が指定された場合には、強制的に曲番号を変更します.
  164. =============================================================================*/
  165. {
  166.     int        c ;
  167.  
  168.     if ( trackno < CDDA_INFO_buf.start ) trackno = CDDA_INFO_buf.start ;
  169.     if ( trackno > CDDA_INFO_buf.end )   trackno = CDDA_INFO_buf.end ;
  170.  
  171.     if ( CDDA_data_check( trackno ) ) {                    /*  データ        */
  172.         for ( c=trackno+1; c<CDDA_INFO_buf.end; c++ ) {
  173.             trackno ++ ;
  174.             if ( !CDDA_data_check( trackno ) ) {        /*  曲            */
  175.                 break ;
  176.             }
  177.         }
  178.         if ( c == CDDA_INFO_buf.end ) trackno = CDDA_INFO_buf.end ;
  179.     }
  180.  
  181.     CDDA_NOW_start = trackno ;
  182.  
  183.     CDDA_CLOCK_start.sec   = CDDA_INFO_buf.track[trackno-1].sec ;
  184.     CDDA_CLOCK_start.min   = CDDA_INFO_buf.track[trackno-1].min ;
  185.     CDDA_CLOCK_start.frame = CDDA_INFO_buf.track[trackno-1].frame ;
  186. }
  187.  
  188. /*************************  演奏終了時間の設定  ******************************/
  189. void CDDA_set_time_end( int trackno )
  190. /*=============================================================================
  191. **    演奏用の終了時間を設定する.
  192. **
  193. **    < INPUT  > : 演奏終了トラック(曲番号)
  194. **    < OUTPUT > : なし
  195. **    < RETURN > : なし
  196. **
  197. **    不当な曲番号が指定された場合には、強制的に曲番号を変更します.
  198. =============================================================================*/
  199. {
  200.     char    minw, secw, framew ;
  201.     int        c ;
  202.  
  203. /*    frame : 0 - 74 : 75frame=1sec    */
  204.  
  205.     if ( trackno < CDDA_INFO_buf.start ) trackno = CDDA_INFO_buf.start ;
  206.     if ( trackno < CDDA_INFO_buf.end ) {
  207.         if ( CDDA_data_check( trackno+1 ) ) {                /*  データ        */
  208.             trackno ++ ;
  209.             for ( c=trackno+1; c<CDDA_INFO_buf.end; c++ ) {
  210.                 trackno ++ ;
  211.                 if ( !CDDA_data_check( trackno ) ) {        /*  曲            */
  212.                     break ;
  213.                 }
  214.             }
  215.             if ( c >= CDDA_INFO_buf.end ) trackno = CDDA_INFO_buf.end ;
  216.         }
  217.     } else {
  218.         trackno = CDDA_INFO_buf.end ;
  219.     }
  220. /*
  221. **    最後の曲まで(または最後の曲だけを)演奏した~い時には、
  222. **    演奏終了時間の指定に注意しましょう!
  223. **
  224. **    ※ 演奏終了時間は、ディスク内演奏終了時間から 1 フレーム引いた値を指定
  225. **       しないとだめだよ!
  226. */
  227.     if ( trackno >= CDDA_INFO_buf.end ) {    /*  最終曲が指定された時    */
  228.         trackno = CDDA_INFO_buf.end ;
  229.         framew = CDDA_INFO_buf.discend.frame ;
  230.         secw   = CDDA_INFO_buf.discend.sec ;
  231.         minw   = CDDA_INFO_buf.discend.min ;
  232.     } else {                                    /*  最終曲じゃない時        */
  233.         framew = CDDA_INFO_buf.track[trackno].frame ;
  234.         secw   = CDDA_INFO_buf.track[trackno].sec ;
  235.         minw   = CDDA_INFO_buf.track[trackno].min ;
  236.     }
  237.                                                             /*  1フレーム引く    */
  238.     CDDA_subtime( minw,secw,framew,0,0,1,&minw,&secw,&framew ) ;
  239.  
  240.     CDDA_NOW_end = trackno ;
  241.  
  242.     CDDA_CLOCK_end.frame = framew ;
  243.     CDDA_CLOCK_end.sec = secw ;
  244.     CDDA_CLOCK_end.min = minw ;
  245. }
  246.  
  247. /****************************  各曲の時間を求める  ***************************/
  248. void CDDA_timecalc( void )
  249. /*=============================================================================
  250. **    各曲の演奏時間, 音楽部分の合計時間, データ部分の合計時間を求める.
  251. **
  252. **    < INPUT  > : なし
  253. **    < OUTPUT > : なし
  254. **    < RETURN > : なし
  255. **
  256. **    必ず TOC情報取得後にこの関数をCALLして下さい.
  257. =============================================================================*/
  258. {
  259.     int        c ;
  260.     char    minw, min2, sec2, frame2 ;
  261.  
  262. /*    一番上のビットがONの場合には、曲ではなくデータである。    */
  263.  
  264.     CDDA_TIME_music.min = CDDA_TIME_music.sec = CDDA_TIME_music.frame = 0 ;
  265.     CDDA_TIME_data.min = CDDA_TIME_data.sec = CDDA_TIME_data.frame = 0 ;
  266.  
  267.     for ( c=0; c<CDDA_INFO_buf.end; c++ ) {
  268.  
  269.         minw = CDDA_INFO_buf.track[c].min ;
  270.         if ( ( minw & 0x80 ) == 0x80 ) minw &= 0x7f ;
  271.  
  272.         if ( c+1 < CDDA_INFO_buf.end ) {            /*  次の曲が最終曲ヨリ前    */
  273.             frame2 = CDDA_INFO_buf.track[c+1].frame ;
  274.             sec2 = CDDA_INFO_buf.track[c+1].sec ;
  275.             min2 = CDDA_INFO_buf.track[c+1].min ;
  276.             if ( ( min2 & 0x80 ) == 0x80 ) min2 &= 0x7f ;
  277.         } else {                                    /*  次の曲が最終曲        */
  278.             frame2 = CDDA_INFO_buf.discend.frame ;
  279.             sec2 = CDDA_INFO_buf.discend.sec ;
  280.             min2 = CDDA_INFO_buf.discend.min ;
  281.             if ( ( min2 & 0x80 ) == 0x80 ) min2 &= 0x7f ;
  282.             CDDA_subtime( min2,sec2,frame2,0,0,1,&min2,&sec2,&frame2 ) ;
  283.                                                             /*  1フレーム引く    */
  284.         }
  285.         CDDA_subtime( min2,sec2,frame2,minw,
  286.                 CDDA_INFO_buf.track[c].sec,CDDA_INFO_buf.track[c].frame,
  287.                 &CDDA_TIME_track[c].min,&CDDA_TIME_track[c].sec,
  288.                 &CDDA_TIME_track[c].frame ) ;
  289.                                                         /*  曲時間取得        */
  290.         minw = CDDA_INFO_buf.track[c].min ;
  291.         if ( ( minw & 0x80 ) != 0x80 ) {                /*  CD-DA だけ加算    */
  292.             CDDA_addtime( CDDA_TIME_music.min,CDDA_TIME_music.sec,
  293.                     CDDA_TIME_music.frame,
  294.                     CDDA_TIME_track[c].min,CDDA_TIME_track[c].sec,
  295.                     CDDA_TIME_track[c].frame,
  296.                     &CDDA_TIME_music.min,&CDDA_TIME_music.sec,
  297.                     &CDDA_TIME_music.frame ) ;
  298.                                                         /*  合計時間取得    */
  299.         } else {                                        /*  データ部分の合計    */
  300.             CDDA_addtime( CDDA_TIME_data.min,CDDA_TIME_data.sec,
  301.                     CDDA_TIME_data.frame,
  302.                     CDDA_TIME_track[c].min,CDDA_TIME_track[c].sec,
  303.                     CDDA_TIME_track[c].frame,
  304.                     &CDDA_TIME_data.min,&CDDA_TIME_data.sec,
  305.                     &CDDA_TIME_data.frame ) ;
  306.                                                         /*  合計時間取得    */
  307.         }
  308.     }
  309. /*
  310. **    プログラム時間クリア
  311. */
  312.     CDDA_TIME_program.min   = CDDA_ZERO ;
  313.     CDDA_TIME_program.sec   = CDDA_ZERO ;
  314.     CDDA_TIME_program.frame = CDDA_ZERO ;
  315. }
  316.  
  317. /**************************  現在の残り時間を求める  *************************/
  318. void CDDA_remaintime( void )
  319. /*=============================================================================
  320. **    演奏時間(曲内時間,ディスク内時間)を求める.
  321. **
  322. **    < INPUT  > : なし
  323. **    < OUTPUT > : なし
  324. **    < RETURN > : なし
  325. **
  326. **    演奏状態取得後にこの関数をCALLして下さい.
  327. **    (CDDA_status()で、この関数はCALLされています)
  328. =============================================================================*/
  329. {
  330.     int        c ;
  331.  
  332. /*
  333. **    曲番号が不正な時(演奏可能曲でない時)
  334. */
  335.     if ( CDDA_INFO_buf.start > CDDA_NOW_musicno ||
  336.             CDDA_NOW_musicno > CDDA_INFO_buf.end ||
  337.             CDDA_data_check( CDDA_NOW_musicno ) ||
  338.             CDDA_NOW_musicno <= CDDA_ZERO ) {
  339.         CDDA_CLOCK_nowtrack.min   = CDDA_ZERO ;
  340.         CDDA_CLOCK_nowtrack.sec   = CDDA_ZERO ;
  341.         CDDA_CLOCK_nowtrack.frame = CDDA_ZERO ;
  342.         memcpy( (char *)&CDDA_TIME_nowtrack,(char *)&CDDA_CLOCK_nowtrack,
  343.                 sizeof( CDDA_TRACK ) ) ;
  344.         memcpy( (char *)&CDDA_CLOCK_nowdisc,(char *)&CDDA_CLOCK_nowtrack,
  345.                 sizeof( CDDA_TRACK ) ) ;
  346.         memcpy( (char *)&CDDA_TIME_nowdisc,(char *)&CDDA_CLOCK_nowtrack,
  347.                 sizeof( CDDA_TRACK ) ) ;
  348.         return ;
  349.     }
  350.  
  351. /*
  352. **    現在の曲の残り時間
  353. */
  354.     CDDA_subtime( CDDA_TIME_track[CDDA_NOW_musicno-1].min,
  355.             CDDA_TIME_track[CDDA_NOW_musicno-1].sec,
  356.             CDDA_TIME_track[CDDA_NOW_musicno-1].frame,
  357.             CDDA_CLOCK_nowtrack.min,
  358.             CDDA_CLOCK_nowtrack.sec,
  359.             CDDA_CLOCK_nowtrack.frame,
  360.             &CDDA_TIME_nowtrack.min,
  361.             &CDDA_TIME_nowtrack.sec,
  362.             &CDDA_TIME_nowtrack.frame ) ;
  363.     memcpy( (char *)&CDDA_TIME_nowdisc,(char *)&CDDA_TIME_nowtrack,
  364.             sizeof( CDDA_TRACK ) ) ;
  365.  
  366. /*
  367. **    トータルの残り時間
  368. */
  369.     switch ( CDDA_PLAY_mode ) {
  370.     case CDDA_SW_SHUFFLE :
  371.     case CDDA_SW_PROGRAM :
  372.     case CDDA_SW_CONTINUE :
  373.         for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  374.             if ( CDDA_nplay+c >= CDDA_MAX_TRACK ) break ;
  375.             if ( CDDA_PLAY_no[CDDA_nplay+c] <= CDDA_ZERO ) break ;
  376.             if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_nplay+c]) ) {
  377.                 /*  音楽ならば...    */
  378.                 CDDA_addtime( CDDA_TIME_nowdisc.min,
  379.                     CDDA_TIME_nowdisc.sec,
  380.                     CDDA_TIME_nowdisc.frame,
  381.                     CDDA_TIME_track[CDDA_PLAY_no[CDDA_nplay+c]-1].min,
  382.                     CDDA_TIME_track[CDDA_PLAY_no[CDDA_nplay+c]-1].sec,
  383.                     CDDA_TIME_track[CDDA_PLAY_no[CDDA_nplay+c]-1].frame,
  384.                     &CDDA_TIME_nowdisc.min,
  385.                     &CDDA_TIME_nowdisc.sec,
  386.                     &CDDA_TIME_nowdisc.frame ) ;
  387.             }
  388.         }
  389.         break ;
  390.     case CDDA_SW_SINGLE :
  391.         break ;
  392.     }
  393.  
  394. /*
  395. **    トータルの経過時間
  396. */
  397.     switch ( CDDA_PLAY_mode ) {
  398.     case CDDA_SW_SHUFFLE :
  399.     case CDDA_SW_CONTINUE :
  400.         CDDA_subtime( CDDA_TIME_music.min,
  401.                     CDDA_TIME_music.sec,
  402.                     CDDA_TIME_music.frame,
  403.                     CDDA_TIME_nowdisc.min,
  404.                     CDDA_TIME_nowdisc.sec,
  405.                     CDDA_TIME_nowdisc.frame,
  406.                     &CDDA_CLOCK_nowdisc.min,
  407.                     &CDDA_CLOCK_nowdisc.sec,
  408.                     &CDDA_CLOCK_nowdisc.frame ) ;
  409.         break ;
  410.     case CDDA_SW_PROGRAM :
  411.         CDDA_subtime( CDDA_TIME_program.min,
  412.                     CDDA_TIME_program.sec,
  413.                     CDDA_TIME_program.frame,
  414.                     CDDA_TIME_nowdisc.min,
  415.                     CDDA_TIME_nowdisc.sec,
  416.                     CDDA_TIME_nowdisc.frame,
  417.                     &CDDA_CLOCK_nowdisc.min,
  418.                     &CDDA_CLOCK_nowdisc.sec,
  419.                     &CDDA_CLOCK_nowdisc.frame ) ;
  420.         break ;
  421.     case CDDA_SW_SINGLE :
  422.         memcpy( (char *)&CDDA_CLOCK_nowdisc,(char *)&CDDA_CLOCK_nowtrack,
  423.                 sizeof( CDDA_TRACK ) ) ;
  424.         break ;
  425.     }
  426. }
  427.  
  428. /*********************  プログラム関係の現在の残り時間を求める  *****************/
  429. void CDDA_program_remaintime( void )
  430. /*=============================================================================
  431. **    プログラム関係の演奏時間(曲内時間,ディスク内時間)を求める.
  432. **
  433. **    < INPUT  > : なし
  434. **    < OUTPUT > : なし
  435. **    < RETURN > : なし
  436. **
  437. **    プログラムモードの時に曲番号の追加/確認用にこの関数を使用します.
  438. **    プログラム合計時間(CDDA_TIME_PROGRAM), 曲内経過時間(CDDA_CLOCK_nowtrack)は、
  439. **    呼び出す前に設定しておいて下さい.
  440. =============================================================================*/
  441. {
  442.     int        c, sp ;
  443.  
  444.     if ( CDDA_PLAY_mode != CDDA_SW_PROGRAM ) return ;
  445.  
  446. /*
  447. **    現在の曲内残り時間
  448. */
  449.     if ( CDDA_NOW_musicno > CDDA_ZERO ) {
  450.         CDDA_subtime( CDDA_TIME_track[CDDA_NOW_musicno-1].min,
  451.                 CDDA_TIME_track[CDDA_NOW_musicno-1].sec,
  452.                 CDDA_TIME_track[CDDA_NOW_musicno-1].frame,
  453.                 CDDA_CLOCK_nowtrack.min,
  454.                 CDDA_CLOCK_nowtrack.sec,
  455.                 CDDA_CLOCK_nowtrack.frame,
  456.                 &CDDA_TIME_nowtrack.min,
  457.                 &CDDA_TIME_nowtrack.sec,
  458.                 &CDDA_TIME_nowtrack.frame ) ;
  459.     } else {
  460.         CDDA_TIME_nowtrack.min   = CDDA_ZERO ;
  461.         CDDA_TIME_nowtrack.sec   = CDDA_ZERO ;
  462.         CDDA_TIME_nowtrack.frame = CDDA_ZERO ;
  463.     }
  464.  
  465. /*
  466. **    トータルの残り時間
  467. */
  468.     memcpy( (char *)&CDDA_TIME_nowdisc,(char *)&CDDA_TIME_nowtrack,
  469.             sizeof( CDDA_TRACK ) ) ;
  470.     for ( c=0; c<CDDA_MAX_TRACK; c++ ) {
  471.         if ( CDDA_prgptr+c >= CDDA_MAX_TRACK ) break ;
  472.         if ( CDDA_PLAY_no[CDDA_prgptr+c] <= CDDA_ZERO ) break ;
  473.         if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_prgptr+c]) ) {
  474.             /*  音楽ならば...    */
  475.             CDDA_addtime( CDDA_TIME_nowdisc.min,
  476.                 CDDA_TIME_nowdisc.sec,
  477.                 CDDA_TIME_nowdisc.frame,
  478.                 CDDA_TIME_track[CDDA_PLAY_no[CDDA_prgptr+c]-1].min,
  479.                 CDDA_TIME_track[CDDA_PLAY_no[CDDA_prgptr+c]-1].sec,
  480.                 CDDA_TIME_track[CDDA_PLAY_no[CDDA_prgptr+c]-1].frame,
  481.                 &CDDA_TIME_nowdisc.min,
  482.                 &CDDA_TIME_nowdisc.sec,
  483.                 &CDDA_TIME_nowdisc.frame ) ;
  484.         }
  485.     }
  486.     if ( CDDA_prgptr == CDDA_ZERO ) {
  487.         CDDA_subtime( CDDA_TIME_nowdisc.min,
  488.                     CDDA_TIME_nowdisc.sec,
  489.                     CDDA_TIME_nowdisc.frame,
  490.                     CDDA_TIME_nowtrack.min,
  491.                     CDDA_TIME_nowtrack.sec,
  492.                     CDDA_TIME_nowtrack.frame,
  493.                     &CDDA_TIME_nowdisc.min,
  494.                     &CDDA_TIME_nowdisc.sec,
  495.                     &CDDA_TIME_nowdisc.frame ) ;
  496.     }
  497.  
  498. /*
  499. **    トータル経過時間
  500. */
  501.     CDDA_subtime( CDDA_TIME_program.min,
  502.                 CDDA_TIME_program.sec,
  503.                 CDDA_TIME_program.frame,
  504.                 CDDA_TIME_nowdisc.min,
  505.                 CDDA_TIME_nowdisc.sec,
  506.                 CDDA_TIME_nowdisc.frame,
  507.                 &CDDA_CLOCK_nowdisc.min,
  508.                 &CDDA_CLOCK_nowdisc.sec,
  509.                 &CDDA_CLOCK_nowdisc.frame ) ;
  510.  
  511. /*
  512. **    プログラム経過時間(未演奏曲(演奏中含)から指示された曲番号までの合計)
  513. */
  514.     CDDA_CLOCK_program.min   = CDDA_ZERO ;
  515.     CDDA_CLOCK_program.sec   = CDDA_ZERO ;
  516.     CDDA_CLOCK_program.frame = CDDA_ZERO ;
  517.     sp = CDDA_ZERO ;
  518.     if ( CDDA_nplay > CDDA_ZERO ) sp = CDDA_nplay - 1 ;
  519.     for ( c=sp; c<CDDA_MAX_TRACK; c++ ) {
  520.         if ( CDDA_PLAY_no[c] == CDDA_ZERO ) break ;
  521.         if ( CDDA_prgptr && c == CDDA_prgptr ) break ;
  522.         CDDA_addtime( CDDA_CLOCK_program.min,
  523.                 CDDA_CLOCK_program.sec,
  524.                 CDDA_CLOCK_program.frame,
  525.                 CDDA_TIME_track[CDDA_PLAY_no[c]-1].min,
  526.                 CDDA_TIME_track[CDDA_PLAY_no[c]-1].sec,
  527.                 CDDA_TIME_track[CDDA_PLAY_no[c]-1].frame,
  528.                 &CDDA_CLOCK_program.min,
  529.                 &CDDA_CLOCK_program.sec,
  530.                 &CDDA_CLOCK_program.frame ) ;
  531.     }
  532. }
  533.  
  534. /***************************  データかどうかチェックする  **************************/
  535. int CDDA_data_check( int musicno )
  536. /*=============================================================================
  537. **    指定された曲番号がデータかどうかチェックする.
  538. **
  539. **    < INPUT  > : 曲番号
  540. **    < OUTPUT > : なし
  541. **    < RETURN > : データ ならば 真値 , 音楽 ならば 偽値.
  542. **
  543. **    不当な曲番号を指定しないで下さい.
  544. =============================================================================*/
  545. {
  546.     if ( musicno <= CDDA_ZERO ) return( CDDA_FALSE ) ;
  547.     return( ( ( CDDA_INFO_buf.track[musicno-1].min & 0x80 ) == 0x80 ) ?
  548.         CDDA_TRUE : CDDA_FALSE ) ;
  549. }
  550.  
  551. /*******************************  次の曲を設定  ******************************/
  552. int CDDA_next_music( void )
  553. /*=============================================================================
  554. **    次に演奏する曲番号を設定する.
  555. **
  556. **    < INPUT  > : なし
  557. **    < OUTPUT > : なし
  558. **    < RETURN > : エラー値(演奏曲がなくなった場合にはエラーを返す)
  559. =============================================================================*/
  560. {
  561.     char    endflg ;
  562.     int        c ;
  563.  
  564. /*
  565. **    次の曲番号設定
  566. */
  567.     endflg = CDDA_FALSE ;
  568.     for ( c=CDDA_nplay; c<=CDDA_MAX_TRACK; c++ ) {
  569.         if ( CDDA_PLAY_no[c] == CDDA_ZERO ) {
  570.             endflg = CDDA_TRUE ;
  571.             break ;
  572.         }
  573.         CDDA_nplay ++ ;
  574.         if ( CDDA_nplay > CDDA_MAX_TRACK ) {
  575.             CDDA_nplay = CDDA_MAX_TRACK ;
  576.             endflg = CDDA_TRUE ;
  577.             break ;
  578.         }
  579.         if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_nplay-1]) ) {
  580.             /*  音楽ならば...    */
  581.             CDDA_NOW_start = CDDA_PLAY_no[CDDA_nplay-1] ;    /*  演奏曲番号    */
  582.             break ;
  583.         }
  584.     }
  585.     if ( endflg ) {
  586.         CDDA_NOW_end = CDDA_NOW_start ;
  587.     } else {
  588.         switch ( CDDA_PLAY_mode ) {
  589.         case CDDA_SW_SHUFFLE :
  590.         case CDDA_SW_PROGRAM :
  591.         case CDDA_SW_SINGLE :
  592.             CDDA_NOW_end = CDDA_NOW_start ;
  593.             break ;
  594.         case CDDA_SW_CONTINUE :
  595.             CDDA_NOW_end = CDDA_INFO_buf.end ;
  596.             break ;
  597.         }
  598.     }
  599.  
  600.     if ( CDDA_PLAY_mode == CDDA_SW_PROGRAM ) {
  601.         CDDA_prgptr = CDDA_ZERO ;
  602.         if ( endflg ) {
  603.             if ( CDDA_nplay > CDDA_ZERO ) {
  604.                 if ( CDDA_PLAY_no[CDDA_nplay-1] == CDDA_ZERO ) {
  605.                     CDDA_REMAIN_program = CDDA_ZERO ;
  606.                 }
  607.             } else {
  608.                 CDDA_REMAIN_program = CDDA_ZERO ;
  609.             }
  610.         } else {
  611.             CDDA_REMAIN_program -- ;
  612.         }
  613.     }
  614.  
  615. /*
  616. **    return
  617. */
  618.     return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
  619. }
  620.  
  621. /*******************************  前の曲を設定  ******************************/
  622. int CDDA_before_music( void )
  623. /*=============================================================================
  624. **    一曲前に演奏した曲番号を設定する.
  625. **
  626. **    < INPUT  > : なし
  627. **    < OUTPUT > : なし
  628. **    < RETURN > : エラー値(演奏曲が先頭よりも前になった場合にはエラーを返す)
  629. =============================================================================*/
  630. {
  631.     int        cmp ;
  632.     char    endflg ;
  633.     int        c ;
  634.  
  635. /*
  636. **    曲番号のチェック
  637. */
  638.     endflg = CDDA_FALSE ;
  639.     cmp = CDDA_cmptime(    (signed char)CDDA_CLOCK_nowtrack.min,
  640.                         (signed char)CDDA_CLOCK_nowtrack.sec,
  641.                         (signed char)CDDA_CLOCK_nowtrack.frame,
  642.                         0,2,0 ) ;
  643.     if ( CDDA_NOW_start == CDDA_PLAY_no[0] && cmp <= CDDA_ZERO )
  644.         endflg = CDDA_TRUE ;
  645.     if ( CDDA_PLAY_no[0] == CDDA_ZERO ) endflg = CDDA_TRUE ;
  646. /*-----------------------------------------------------------------------------
  647. **    シャッフルモード, プログラムモード時には、前の曲に戻ることはしない.
  648. -----------------------------------------------------------------------------*/
  649.     switch ( CDDA_PLAY_mode ) {
  650.     case CDDA_SW_SHUFFLE :
  651.     case CDDA_SW_PROGRAM :
  652.         endflg = CDDA_TRUE ;
  653.     }
  654.  
  655. /*
  656. **    前の曲番号設定
  657. */
  658.     if ( cmp <= CDDA_ZERO && !endflg ) {
  659.         for ( c=CDDA_nplay; c>=CDDA_ZERO; c-- ) {
  660.             CDDA_nplay -- ;
  661.             if ( CDDA_nplay <= CDDA_ZERO ) {
  662.                 CDDA_nplay = CDDA_ZERO ;
  663.                 endflg = CDDA_TRUE ;
  664.                 break ;
  665.             }
  666.             if ( CDDA_PLAY_no[CDDA_nplay-1] == CDDA_ZERO ) {
  667.                 endflg = CDDA_TRUE ;
  668.                 break ;
  669.             }
  670.             if ( !CDDA_data_check(CDDA_PLAY_no[CDDA_nplay-1]) ) {
  671.                 /*  音楽ならば...    */
  672.                 CDDA_NOW_start = CDDA_PLAY_no[CDDA_nplay-1] ;/*  演奏曲番号    */
  673.                 break ;
  674.             }
  675.         }
  676.         if ( !endflg ) {
  677.             switch ( CDDA_PLAY_mode ) {
  678.             case CDDA_SW_SHUFFLE :
  679.             case CDDA_SW_PROGRAM :
  680.             case CDDA_SW_SINGLE :
  681.                 CDDA_NOW_end = CDDA_NOW_start ;
  682.                 break ;
  683.             case CDDA_SW_CONTINUE :
  684.                 CDDA_NOW_end = CDDA_INFO_buf.end ;
  685.                 break ;
  686.             }
  687.         }
  688.     }
  689.  
  690.     if ( CDDA_PLAY_mode == CDDA_SW_PROGRAM ) {
  691.         CDDA_prgptr = CDDA_ZERO ;
  692.     }
  693.  
  694. /*
  695. **    return
  696. */
  697.     return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
  698. }
  699.  
  700. /******************************  CD 先送り処理  ******************************/
  701. int CDDA_fftime( void )
  702. /*=============================================================================
  703. **    演奏時間を先送りする.
  704. **
  705. **    < INPUT  > : なし
  706. **    < OUTPUT > : なし
  707. **    < RETURN > : エラー値(演奏時間が最後に到達した場合にはエラーを返す)
  708. **
  709. **    この関数は、一時停止中にCALLして下さい.
  710. =============================================================================*/
  711. {
  712.     char    nmin, nsec, nframe ;                /*  演奏時間表示用            */
  713.     int        cmp ;
  714.     char    endflg ;
  715.  
  716.     if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {    /*  PAUSE中                    */
  717.         if ( CDDA_NOW_musicno < 1 ) return( CDDA_ERR_PARAMETER ) ;
  718.         CDDA_NOW_start = CDDA_NOW_musicno ;
  719.         CDDA_FLG_pauseplay = CDDA_TRUE ;
  720.         nsec   = CDDA_CLOCK_nowtrack.sec ;
  721.         nmin   = CDDA_CLOCK_nowtrack.min ;
  722.         nframe = CDDA_ZERO ;
  723.     } else {                                    /*  PAUSE中でない            */
  724.         return( CDDA_ERR_NOTPAUSE ) ;
  725.     }
  726.  
  727.     endflg = CDDA_FALSE ;
  728.  
  729. /*
  730. **    時間を送る
  731. */
  732.     CDDA_addtime( nmin,nsec,nframe,0,CDDA_FFREV_SEC,0,&nmin,&nsec,&nframe ) ;
  733.  
  734. /*
  735. **    時間のチェック
  736. */
  737.     cmp = CDDA_cmptime( (signed char)nmin,(signed char)nsec,0,
  738.                 (signed char)CDDA_TIME_track[CDDA_NOW_start-1].min,
  739.                 (signed char)CDDA_TIME_track[CDDA_NOW_start-1].sec,0 ) ;
  740.  
  741.     if ( cmp > 0 ) {                                /*  次の曲時間に突入    */
  742. /*
  743. **    次の曲番号設定
  744. */
  745.         if ( CDDA_next_music() ) endflg = CDDA_TRUE ;
  746.         nmin = nsec = nframe = CDDA_ZERO ;
  747.     }
  748.  
  749.     CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
  750.  
  751. /*
  752. **    演奏時間の指定
  753. */
  754.     if ( endflg ) {                                /*  終了させる                */
  755.         CDDA_set_time_end( CDDA_NOW_end ) ;        /*  演奏終了曲データ設定    */
  756.         memcpy( (char *)&CDDA_CLOCK_start,(char *)&CDDA_CLOCK_end,
  757.                 sizeof( CDDA_TRACK ) ) ;
  758.         nmin   = CDDA_TIME_track[CDDA_NOW_end-1].min ;
  759.         nsec   = CDDA_TIME_track[CDDA_NOW_end-1].sec ;
  760.         nframe = CDDA_TIME_track[CDDA_NOW_end-1].frame ;
  761.     } else {
  762.         CDDA_set_time_start( CDDA_NOW_start ) ;    /*  演奏開始曲データ設定    */
  763.         CDDA_addtime( CDDA_CLOCK_start.min,
  764.                 CDDA_CLOCK_start.sec,
  765.                 CDDA_CLOCK_start.frame,
  766.                 nmin,nsec,0,
  767.                 &CDDA_CLOCK_start.min,
  768.                 &CDDA_CLOCK_start.sec,
  769.                 &CDDA_CLOCK_start.frame ) ;
  770.         CDDA_set_time_end( CDDA_NOW_end ) ;        /*  演奏終了曲データ設定    */
  771.         if ( cmp > 0 ) CDDA_seek() ;
  772.     }
  773.  
  774. /*
  775. **    現在の曲内経過時間
  776. */
  777.     CDDA_CLOCK_nowtrack.min   = nmin ;
  778.     CDDA_CLOCK_nowtrack.sec   = nsec ;
  779.     CDDA_CLOCK_nowtrack.frame = nframe ;
  780.     memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
  781.             sizeof( CDDA_TRACK ) ) ;
  782.  
  783. /*
  784. **    現在の残り時間
  785. */
  786.     CDDA_remaintime() ;
  787.  
  788. /*
  789. **    return
  790. */
  791.     return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
  792. }
  793.  
  794. /******************************  CD 後戻り処理  ******************************/
  795. int CDDA_rewtime( void )
  796. /*=============================================================================
  797. **    演奏時間を後戻りする.
  798. **
  799. **    < INPUT  > : なし
  800. **    < OUTPUT > : なし
  801. **    < RETURN > : エラー値(演奏時間が先頭に到達した場合にはエラーを返す)
  802. **
  803. **    この関数は、一時停止中にCALLして下さい.
  804. =============================================================================*/
  805. {
  806.     char    nmin, nsec, nframe ;                    /*  演奏時間表示用        */
  807.     int        cmp ;
  808.     char    endflg ;
  809.  
  810.     if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {        /*  PAUSE中                */
  811.         if ( CDDA_NOW_musicno < 1 ) return( CDDA_ERR_PARAMETER ) ;
  812.         CDDA_NOW_start = CDDA_NOW_musicno ;
  813.         CDDA_FLG_pauseplay = CDDA_TRUE ;
  814.         nsec   = CDDA_CLOCK_nowtrack.sec ;
  815.         nmin   = CDDA_CLOCK_nowtrack.min ;
  816.         nframe = CDDA_ZERO ;
  817.     } else {                                        /*  PAUSE中でない        */
  818.         return( CDDA_ERR_NOTPAUSE ) ;
  819.     }
  820.  
  821.     endflg = CDDA_FALSE ;
  822.  
  823. /*
  824. **    時間を戻す
  825. */
  826.     CDDA_subtime( nmin,nsec,nframe,0,CDDA_FFREV_SEC,0,&nmin,&nsec,&nframe ) ;
  827.  
  828. /*
  829. **    時間のチェック
  830. */
  831.     cmp = CDDA_cmptime( (signed char)nmin,(signed char)nsec,0,0,0,0 ) ;
  832.  
  833.     if ( cmp < 0 ) {                                /*  前の曲時間に突入    */
  834. /*
  835. **    前の曲番号設定
  836. */
  837.         if ( CDDA_before_music() ) endflg = CDDA_TRUE ;
  838.         if ( endflg ) {
  839.             nmin = nsec = nframe = CDDA_ZERO ;
  840.         } else {
  841.             nmin   = CDDA_TIME_track[CDDA_NOW_start-1].min ;
  842.             nsec   = CDDA_TIME_track[CDDA_NOW_start-1].sec ;
  843.             nframe = CDDA_TIME_track[CDDA_NOW_start-1].frame ;
  844.         }
  845.     }
  846.  
  847.     CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
  848.  
  849. /*
  850. **    演奏時間の指定
  851. */
  852.     CDDA_set_time_start( CDDA_NOW_start ) ;        /*  演奏開始曲データ設定    */
  853.     CDDA_addtime( CDDA_CLOCK_start.min,
  854.             CDDA_CLOCK_start.sec,
  855.             CDDA_CLOCK_start.frame,
  856.             nmin,nsec,0,
  857.             &CDDA_CLOCK_start.min,
  858.             &CDDA_CLOCK_start.sec,
  859.             &CDDA_CLOCK_start.frame ) ;
  860.     CDDA_set_time_end( CDDA_NOW_end ) ;            /*  演奏終了曲データ設定    */
  861.     if ( cmp < 0 ) CDDA_seek() ;
  862.  
  863. /*
  864. **    現在の曲内経過時間
  865. */
  866.     CDDA_CLOCK_nowtrack.min   = nmin ;
  867.     CDDA_CLOCK_nowtrack.sec   = nsec ;
  868.     CDDA_CLOCK_nowtrack.frame = nframe ;
  869.     memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
  870.             sizeof( CDDA_TRACK ) ) ;
  871.  
  872. /*
  873. **    現在の残り時間
  874. */
  875.     CDDA_remaintime() ;
  876.  
  877. /*
  878. **    return
  879. */
  880.     return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
  881. }
  882.  
  883. /****************************  CD 次曲頭出し処理  ****************************/
  884. int CDDA_ffmusic( void )
  885. /*=============================================================================
  886. **    演奏曲を先送りする.
  887. **
  888. **    < INPUT  > : なし
  889. **    < OUTPUT > : なし
  890. **    < RETURN > : エラー値(演奏曲がなくなった場合にはエラーを返す)
  891. **
  892. **    この関数は、一時停止中にCALLして下さい.
  893. =============================================================================*/
  894. {
  895.     char    endflg ;
  896.  
  897. /*
  898. **    演奏状態のチェック
  899. */
  900.     if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {    /*  PAUSE中                    */
  901.         CDDA_FLG_pauseplay = CDDA_TRUE ;
  902.     } else {                                    /*  PAUSE中でない            */
  903.         return( CDDA_ERR_NOTPAUSE ) ;
  904.     }
  905.  
  906. /*
  907. **    次の曲番号設定
  908. */
  909.     endflg = CDDA_FALSE ;
  910.     if ( CDDA_next_music() ) endflg = CDDA_TRUE ;
  911.  
  912.     CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
  913.  
  914. /*
  915. **    演奏時間の指定
  916. */
  917.     CDDA_set_time_start( CDDA_NOW_start ) ;        /*  演奏開始曲データ設定    */
  918.     CDDA_set_time_end( CDDA_NOW_end ) ;            /*  演奏終了曲データ設定    */
  919.  
  920. /*
  921. **    現在の曲内経過時間
  922. */
  923.     if ( endflg ) {                                /*  終了させる                */
  924.         memcpy( (char *)&CDDA_CLOCK_start,(char *)&CDDA_CLOCK_end,
  925.                 sizeof( CDDA_TRACK ) ) ;
  926.         CDDA_CLOCK_nowtrack.min   = CDDA_TIME_track[CDDA_NOW_end-1].min ;
  927.         CDDA_CLOCK_nowtrack.sec   = CDDA_TIME_track[CDDA_NOW_end-1].sec ;
  928.         CDDA_CLOCK_nowtrack.frame = CDDA_TIME_track[CDDA_NOW_end-1].frame ;
  929.     } else {
  930.         CDDA_CLOCK_nowtrack.min   = CDDA_ZERO ;
  931.         CDDA_CLOCK_nowtrack.sec   = CDDA_ZERO ;
  932.         CDDA_CLOCK_nowtrack.frame = CDDA_ZERO ;
  933.     }
  934.     CDDA_seek() ;
  935.     memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
  936.             sizeof( CDDA_TRACK ) ) ;
  937.  
  938. /*
  939. **    現在の残り時間
  940. */
  941.     CDDA_remaintime() ;
  942.  
  943. /*
  944. **    return
  945. */
  946.     return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
  947. }
  948.  
  949. /****************************  CD 前曲頭出し処理  ****************************/
  950. int CDDA_rewmusic( void )
  951. /*=============================================================================
  952. **    演奏曲を後戻りする(演奏中の曲は頭出しとする).
  953. **
  954. **    < INPUT  > : なし
  955. **    < OUTPUT > : なし
  956. **    < RETURN > : エラー値(演奏曲が先頭よりも前になった場合にはエラーを返す)
  957. **
  958. **    この関数は、一時停止中にCALLして下さい.
  959. =============================================================================*/
  960. {
  961.     char    endflg ;
  962.  
  963. /*
  964. **    演奏状態のチェック
  965. */
  966.     if ( CDDA_NOW_status == CDDA_STAT_PAUSE ) {        /*  PAUSE中                */
  967.         CDDA_FLG_pauseplay = CDDA_TRUE ;
  968.     } else {                                        /*  PAUSE中でない        */
  969.         return( CDDA_ERR_NOTPAUSE ) ;
  970.     }
  971.  
  972. /*
  973. **    前の曲番号設定
  974. */
  975.     endflg = CDDA_FALSE ;
  976.     if ( CDDA_before_music() ) endflg = CDDA_TRUE ;
  977.  
  978.     CDDA_NOW_pause = CDDA_NOW_musicno = CDDA_NOW_start ;
  979.  
  980. /*
  981. **    演奏時間の指定
  982. */
  983.     CDDA_set_time_start( CDDA_NOW_start ) ;        /*  演奏開始曲データ設定    */
  984.     CDDA_set_time_end( CDDA_NOW_end ) ;            /*  演奏終了曲データ設定    */
  985.     CDDA_seek() ;
  986.  
  987. /*
  988. **    現在の曲内経過時間
  989. */
  990.     CDDA_CLOCK_nowtrack.min   = CDDA_ZERO ;
  991.     CDDA_CLOCK_nowtrack.sec   = CDDA_ZERO ;
  992.     CDDA_CLOCK_nowtrack.frame = CDDA_ZERO ;
  993.     memcpy( (char *)&CDDA_CLOCK_pause,(char *)&CDDA_CLOCK_nowtrack,
  994.             sizeof( CDDA_TRACK ) ) ;
  995.  
  996. /*
  997. **    現在の残り時間
  998. */
  999.     CDDA_remaintime() ;
  1000.  
  1001. /*
  1002. **    return
  1003. */
  1004.     return( endflg ? CDDA_ERR_PARAMETER : CDDA_ERR_NOERROR ) ;
  1005. }
  1006.  
  1007.